From cb3aa9fdd630a5243e7cda6996f1ae21edbf0d8e Mon Sep 17 00:00:00 2001 From: "smh22@boulderdash.cl.cam.ac.uk" Date: Wed, 16 Apr 2003 16:27:08 +0000 Subject: [PATCH] bitkeeper revision 1.173 (3e9d845cg2MJfwRaBzAjIko6HkW-Dw) ide-cd.c: verbose errors ide.c: robustify --- xen/drivers/ide/ide-cd.c | 2 ++ xen/drivers/ide/ide.c | 22 +++++++++++++++------- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/xen/drivers/ide/ide-cd.c b/xen/drivers/ide/ide-cd.c index c851f0485b..26def23823 100644 --- a/xen/drivers/ide/ide-cd.c +++ b/xen/drivers/ide/ide-cd.c @@ -623,6 +623,8 @@ static int cdrom_decode_status (ide_startstop_t *startstop, ide_drive_t *drive, command request to the request sense request. */ if ((stat & ERR_STAT) != 0) { + // XXX SMH: if we get here we should retry ... hmmm + printk("ide-cd: error (stat = 0x%x): will retry\n", stat); wait = rq->waiting; rq->waiting = NULL; } diff --git a/xen/drivers/ide/ide.c b/xen/drivers/ide/ide.c index 86cf7bca66..89db06eb8d 100644 --- a/xen/drivers/ide/ide.c +++ b/xen/drivers/ide/ide.c @@ -2060,14 +2060,22 @@ int ide_do_drive_cmd (ide_drive_t *drive, struct request *rq, ide_action_t actio /* XXX SMH: spin waiting for response */ if (action == ide_wait) { - while(*(int *)rq->waiting) { - udelay(500); - usecs += 500; - if(usecs > 1000000) { - printk("ide_do_drive_cmd [ide_wait]: giving up after 1s\n"); - *(int *)rq->waiting = 0; - } + + /* if we get an error, ide-cd.c requeues (and kills our 'waitq') */ + if((rq->waiting != NULL) && *(int *)(rq->waiting)) { + do { + udelay(500); + usecs += 500; + if(usecs > 1000000) { + printk("ide_do_drive_cmd [ide_wait]: giving " + "up after 1s\n"); + *(int *)rq->waiting = 0; + } + } while((rq->waiting != NULL) && *(int *)(rq->waiting)); } + + if(rq->waiting == NULL) + return 1; } return 0; -- 2.30.2